package com.tuozixuan.util;

import java.io.File;
import java.util.List;
import java.util.Map;
import java.util.Objects;
import java.util.stream.Collectors;
import java.util.stream.Stream;

import org.apache.commons.lang3.StringUtils;

import cn.hutool.core.io.FileUtil;

public final class ProjectUtils {

	private ProjectUtils() {
		
	}
	
	/**
	 * 從路徑下獲取指定文件名的文件列表
	 * 
	 * @param path 路徑
	 * @param fileName 文件名
	 * @return List<File> 文件列表
	 */
	public static List<File> getFileListByFileName(String path, String fileName) {
		return FileUtil.loopFiles(path, file -> StringUtils.equals(fileName, file.getName()));
	}
	
	/**
	 * 從路徑下獲取指定文件名模式（正則表達式）的文件列表
	 * 
	 * @param path 路徑
	 * @param fileNamePattern 文件名模式
	 * @return List<File> 文件列表
	 */
	public static List<File> getFileListByFileNamePattern(String path, String fileNamePattern) {
		return FileUtil.loopFiles(path, file -> file.getName().matches(fileNamePattern));
	}
	
	/**
	 * 從路徑下獲取指定文件名的文件全路徑名列表
	 * 
	 * @param path 路徑
	 * @param fileName 文件名
	 * @return List<String> 文件全路徑名列表
	 */
	public static List<String> getFullPathNameListByFileName(String path, String fileName) {
		List<File> fileList = getFileListByFileName(path, fileName);
		return fileList.stream().map(File::getAbsolutePath).collect(Collectors.toList());
	}
	
	/**
	 * 從路徑下獲取指定文件名模式（正則表達式）的文件列表
	 * 
	 * @param path 路径
	 * @param fileNamePattern 文件名模式
	 * @return List<String> 文件列表
	 */
	public static List<String> getFullPathNameListByFileNamePattern(String path, String fileNamePattern) {
		List<File> fileList = getFileListByFileNamePattern(path, fileNamePattern);
		return fileList.stream().map(File::getAbsolutePath).collect(Collectors.toList());
	}
	
	/**
	 * 從路徑下獲取指定文件名的文件相对路徑名列表
	 * 
	 * @param path 路徑
	 * @param fileName 文件名
	 * @return List<String> 文件相对路徑名列表
	 */
	public static List<String> getRelativePathNameListByFileName(String path, String fileName) {
		return getRelativePathNameListByFileName(path, fileName, null);
	}
	
	/**
	 * 從路徑下獲取指定文件名的文件相对路徑名列表
	 * 
	 * @param path 路徑
	 * @param fileName 文件名
	 * @param resultSeparator 最终产生的相对路徑名使用的分隔符
	 * @return List<String> 文件相对路徑名列表
	 */
	public static List<String> getRelativePathNameListByFileName(String path, String fileName, String resultSeparator) {
		List<File> fileList = getFileListByFileName(path, fileName);
		Stream<String> filePathStream = fileList.stream().map(File::getAbsolutePath)
				.map(name -> StringUtils.removeStart(name, path + File.separator));
		if (Objects.nonNull(resultSeparator)) {
			filePathStream = filePathStream.map(input -> StringUtils.replace(input, File.separator, resultSeparator));
		}
		return filePathStream.collect(Collectors.toList());
	}
	
	/**
	 * 使用正则表达式替换文件中的内容
	 * 
	 * @param file 文件
	 * @param replaceMap 替换信息Map key:正则表达式 value:要替换的内容
	 */
	public static void replaceFileContent(File file, Map<String, String> replaceMap) {
		
		String content = FileUtil.readUtf8String(file);
		for (Map.Entry<String, String> entry : replaceMap.entrySet()) {
			content = content.replaceAll(entry.getKey(), entry.getValue());
		}
		FileUtil.writeUtf8String(content, file);
	}
	
}
